#include "app_common.h"
#include <sys/time.h>
#include <stddef.h>
#include <stdlib.h>
#include "log/log.h"
#include <string.h>

long app_common_GetCurrentTime(void){
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

char *app_common_charsToHexstr(char *chars, int chars_len)
{
    // 将字符数组数据转换为16进制字符串
    // XXabcd -> "5858" "61626364"
    // 1、分配内存空间
    char *id = (char *)malloc(chars_len * 2 + 1);
    if (id == NULL)
    {
        log_error("malloc failed");
        return NULL;
    }
    

    // 2、将字符数组数据转换为16进制字符串
    for (int i = 0; i < chars_len; i++)
    {
        sprintf(id + i * 2, "%02X", chars[i]);
    }

    // 3、字符串结束符
    id[chars_len * 2] = '\0';

    return id;
}

char *app_common_hexstrToChars(char *hexstr, int *chars_len)
{
    // 将16进制字符串转换为字符数组数据
    // "5858" "61626364" -> XXabcd
    // 1、计算字符数组长度
    *chars_len = strlen(hexstr) / 2;

    // 2、分配内存空间
    char *chars = (char *)malloc(*chars_len);
    if (chars == NULL)
    {
        log_error("malloc failed");
        return NULL;
    }

    // 3、将16进制字符串转换为字符数组数据
    // 解释"%2hhX": hh表示有符号的8位整数，X表示16进制，2表示每个16进制字符占2个字节
    for (int i = 0; i < *chars_len; i++){
        sscanf(hexstr + i * 2, "%2hhX", chars + i);
    }

    return chars;
}
